#include <glib.h>

static void test_case (void)
{
    gint x = 2, y = 3, z = 5;

    g_assert( x + y == z);
    
}

static void test_assert(void)
{
    g_assert( FALSE );
}

static void test_assert_not_reached(void)
{
    g_assert_not_reached();
}

static void test_assert_cmpstr(void)
{
    gchar *s1 = "abcd";
    g_assert_cmpstr(s1, ==, "abcd");
}

static void test_assert_cmpint(void)
{
    gint n1 = 100;
    g_assert_cmpint(n1, == , 100);
}

static void test_assert_cmpuint(void)
{
    guint n1 = 200;
    g_assert_cmpuint(n1, ==, 200);
}

static void test_assert_cmphex(void)
{
    guint n1 = 0xdeadbeef;
    g_assert_cmphex(n1, ==, 0xdeedbeef);
}

static void test_assert_cmpfloat(void)
{
    gfloat n1 = 0.00001;
    g_assert_cmpfloat(n1, ==, 0.00001);
}

static void test_assert_no_error(void)
{
    GDir *dir = NULL;
    GError *err = NULL;

    dir = g_dir_open("/tmp", 0, &err);
    g_assert (dir != NULL);
    g_assert_no_error(err);
    if(NULL != err) {
        g_error_free(err);
    }
}

static void test_assert_error(void)
{
    GDir *dir;
    GError *error;

    error = NULL;
    dir = g_dir_open ("/pfrkstrf", 0, &error);
    g_assert (dir == NULL);
    g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
    if(NULL != error) {
        g_error_free (error);
    }
}


static void test_assert_true(void)
{
    g_assert_true(TRUE);
}

static void test_assert_false(void)
{
    g_assert_false(FALSE);
}

static void test_assert_null(void)
{
    gpointer *p = NULL;

    g_assert_null(p);
}

static void test_assert_nonnull(void)
{
    gpointer *p = NULL;

    g_assert_nonnull(p);
}

gint main(gint argc, gchar **argv)
{
    g_test_init(&argc, &argv, NULL);

    g_test_add_func("/test/testcase", test_case);
    g_test_add_func("/test/test_assert", test_assert);
    g_test_add_func("/test/test_assert_not_reached", test_assert_not_reached);
    g_test_add_func("/test/test_assert/cmp/cmpstr", test_assert_cmpstr);
    g_test_add_func("/test/test_assert/cmp/cmpint", test_assert_cmpint);
    g_test_add_func("/test/test_assert/cmp/cmpuint", test_assert_cmpuint);
    g_test_add_func("/test/test_assert/cmp/cmphex", test_assert_cmphex);
    g_test_add_func("/test/test_assert/cmp/cmpfloat", test_assert_cmpfloat);
    g_test_add_func("/test/test_assert/error/no_error", test_assert_no_error);
    g_test_add_func("/test/test_assert/error/error", test_assert_error);
    g_test_add_func("/test/test_assert/boolean/true", test_assert_true);
    g_test_add_func("/test/test_assert/boolean/false", test_assert_false);
    g_test_add_func("/test/test_assert/null/null", test_assert_null);
    g_test_add_func("/test/test_assert/null/nonnull", test_assert_nonnull);

    return g_test_run();
}
